#include <iostream>
#include <string>
#include <mysql/mysql.h>

using namespace std;

const string host = "127.0.0.1";
const string user = "zxj";
const string passwd = "123";
const string db = "zxj_database";
const size_t port = 8080;

int main()
{
    // for test mysql lib
    // cout << "Hello, mysql:" << mysql_get_client_info() << endl;

    // 1. 初始化创建MySQL对象
    MYSQL *mysql = mysql_init(nullptr);

    // 2. 连接MySQL服务器
    if (mysql_real_connect(mysql, host.c_str(), user.c_str(), passwd.c_str(), db.c_str(), port, nullptr, 0) == nullptr)
    {
        cout << "connect mysql server failed." << endl;
        return -1;
    }
    cout << "connect mysql server success." << endl;

    // 3. 设置编码格式
    int ret = mysql_set_character_set(mysql, "utf8");
    if (ret != 0)
    {
        cout << "set character failed." << endl;
        return -1;
    }
    cout << "set character success." << endl;

    // 4. 执行SQL语句
    // 4.1 创建test_table表 -- 一次性执行 SQL 语句 一般都是提前创建好的
    // string sql = "create  table test_table(id int, name varchar(20))";
    // ret = mysql_query(mysql, sql.c_str());
    // if (ret != 0)
    // {
    //     cout << "create table failed." << endl;
    // }
    // cout << "create table success." << endl;

    // 4.2 插入数据
    // string sql = "insert into test_table values(1, 'zxj')";
    // ret = mysql_query(mysql, sql.c_str());
    // if (ret != 0)
    // {
    //     cout << "insert data failed." << endl;
    // }
    // else
    // {
    //     cout << "insert data success." << endl;
    // }

    // 4.3 查询数据 -- 获取结果集 难点！！！
    // （1）先执行查询语句
    string sql = "select * from test_table";
    ret = mysql_query(mysql, sql.c_str());
    if (ret != 0)
    {
        cout << "select data failed." << endl;
    }
    else
    {
        cout << "select data success." << endl;
    }
    // （2）获取结果集
    MYSQL_RES *res = mysql_store_result(mysql); // 获取结果集 -- 存储在MYSQL_RES对象中
    // （2.1）提取行数和列数
    my_ulonglong rows = mysql_num_rows(res);     // 获取结果集中的行数
    unsigned int fields = mysql_num_fields(res); // 获取结果集中的列数
    cout << "rows: " << rows << endl;
    cout << "fields: " << fields << endl;
    // （2.2）提取列的属性
    MYSQL_FIELD *fields_ptr = mysql_fetch_fields(res); // 获取结果集中的列属性
    for (int i = 0; i < fields; ++i)
    {
        cout << fields_ptr[i].name << "\t";
    }
    cout << endl;
    // （2.3）提取每一行的数据
    MYSQL_ROW row;
    for (int i = 0; i < rows; ++i)
    {
        row = mysql_fetch_row(res); // 获取结果集中的每一行
        for (int j = 0; j < fields; ++j)
        {
            cout << row[j] << "\t";
        }
        cout << endl;
    }
    // （3）释放结果集
    mysql_free_result(res);

    //  n. 关闭数据库连接
    mysql_close(mysql);
    cout << "close mysql server success." << endl;

    return 0;
}